/**
 * 文件名：@InitAfwContextInterceptor.java <br/>
 * 包名：cn.efunbox.afw.web.mvc.interceptor <br/>
 * 项目名：afw-mvc-web <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.web.mvc.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.efunbox.afw.web.mvc.context.WebContextResolver;
import cn.efunbox.afw.web.mvc.springmvc.HandlerMethodHandlerInfoResolver;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import cn.efunbox.afw.core.AfwContext;
import cn.efunbox.afw.core.decoupling.ExtractHolder;
import cn.efunbox.afw.core.mvc.HandlerInfo;
import cn.efunbox.afw.core.mvc.context.Context;
import cn.efunbox.afw.core.mvc.context.ContextResolver;
import cn.efunbox.afw.core.resolver.HandlerInfoResolver;
import cn.efunbox.afw.web.util.AfwWebConstant;

/**
 * 类名：InitAfwContextInterceptor  <br />
 *
 * 功能：初始化AfwContext对象中的内容的拦截器
 *
 * @author xtwin <br />
 * 创建时间：2015年12月3日 上午11:18:06  <br />
 * @version 2015年12月3日
 */
public class InitAfwContextInterceptor extends HandlerInterceptorAdapter  {
	
	// 上下文对象解析器
	private ContextResolver contextResolver= new WebContextResolver();
	
	// 处理器INFO解析器
	private HandlerInfoResolver handlerInfoResolver =new HandlerMethodHandlerInfoResolver();

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月3日 上午11:18:42<br/>
	 * 
	 * @param request
	 * @param response
	 * @param handler
	 * @return
	 * @throws Exception <br/>
	 * @see org.springframework.web.servlet.handler.HandlerInterceptorAdapter#preHandle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object)
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		
		// 将当前的request对象保存到AfwContext中
		AfwContext.setValue(AfwWebConstant.KEY_REQUEST_IN_AFWCONTEXT, request);
		
		// 解析出上下文对象
		Context context = contextResolver.resolve();
		
		/*if (handler instanceof AfwHandlerMethod) {
			// 提取字段处理
			if (context instanceof ExtractHolder) {
				((ExtractHolder) context).setExtract(((AfwHandlerMethod) handler).getExtract());
			}
		}*/
		
		// 提取字段处理
		if (context instanceof ExtractHolder) {
			/**
			 * 只有自定义的handler才会有对应的handlerInfo
			 * 如：一些系统定义的handler，是不会有handlerInfo，比如：org.springframework.web.servlet.handler.AbstractHandlerMapping.PreFlightHandler
			 */
			HandlerInfo info = handlerInfoResolver.resolve(handler);
			
			if (null != info) {
				((ExtractHolder) context).setExtract(info.getExtract());
			}
		}
		
		// 将上下文对象保存到框架上下文中
		AfwContext.setContext(context);
		
		// 放入当前的handler对象
		AfwContext.setValue(AfwWebConstant.KEY_HANDLER_IN_AFWCONTEXT, handler);
		
		return true;
	}
	
	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月3日 上午11:25:57<br/>
	 * 
	 * @param request
	 * @param response
	 * @param handler
	 * @param ex
	 * @throws Exception <br/>
	 * @see org.springframework.web.servlet.handler.HandlerInterceptorAdapter#afterCompletion(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object, java.lang.Exception)
	 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
		// 清理信息
		AfwContext.setContext(null);
		AfwContext.setValue(AfwWebConstant.KEY_REQUEST_IN_AFWCONTEXT, null);
	}

	/**
	 * @version 2015年12月3日-下午3:19:13
	 */
	public void setContextResolver(ContextResolver contextResolver) {
		this.contextResolver = contextResolver;
	}

	/**
	 * @version 2015年12月9日-下午1:44:43
	 */
	public void setHandlerInfoResolver(HandlerInfoResolver handlerInfoResolver) {
		this.handlerInfoResolver = handlerInfoResolver;
	}
}